﻿using System;
using System.ComponentModel;

namespace _5E.Infrastructure.Enum
{
    public static class EnumExtensionMethod
    {
        public static string GetDescription(this System.Enum tEnum)
        {
            DescriptionAttribute descriptionAttribute;
            return tEnum.TryGetAttribute(out descriptionAttribute) ? string.Empty : descriptionAttribute.Description;
        }

        public static bool TryGetAttribute<TAttribute>(this System.Enum tEnum, out TAttribute outAttribute)
            where TAttribute : Attribute
        {
            return tEnum.TryGetAttribute(out outAttribute, false);
        }

        public static bool TryGetAttribute<TAttribute>(this System.Enum tEnum, out TAttribute outAttribute, bool inherit)
            where TAttribute : Attribute
        {
            outAttribute = default(TAttribute);
            TAttribute[] arrAttribute;
            if (tEnum.TryGetAttribute(out arrAttribute, inherit))
            {
                outAttribute = arrAttribute[0];
                return true;
            }
            return false;
        }

        public static bool TryGetAttribute<TAttribute>(this System.Enum tEnum, out TAttribute[] outArrayAttribute)
            where TAttribute : Attribute
        {
            return tEnum.TryGetAttribute(out outArrayAttribute, false);
        }

        public static bool TryGetAttribute<TAttribute>(this System.Enum tEnum, out TAttribute[] outArrayAttribute, bool inherit)
            where TAttribute : Attribute
        {
            var enumType = tEnum.GetType();
            var enumName = System.Enum.GetName(enumType, tEnum);
            var enumField = enumType.GetField(enumName);
            outArrayAttribute = null;
            var exists = false;
            if (enumField != null)
            {
                var arrAttr = enumField.GetCustomAttributes(typeof(TAttribute), inherit);
                if (0 < arrAttr.Length)
                {
                    exists = true;
                    outArrayAttribute = Array.ConvertAll(arrAttr, attr => attr as TAttribute);
                }
            }
            return exists;
        }
    }
}
